import socket, sys, threading 
import wx 
from pyDemin import * 
from pyD import *
host = '127.0.0.1' 
port = int(sys.argv[1])#80037
conf=[]
maxj=3  #nombre max de joueurs , nb necessaire pour debuter la partie
conn_client={} #dictionnaire des connexions clients 
dico={}
lesgrilles={} # dictionnaires des grilles joueurs

### definir une class threadclient  
#class threadclient: 
 





class threadconnexion(threading.Thread) :  
 
#creation de la socket puis connexion 
    def __init__(self,conn) : #conn reference de con 
        threading.Thread.__init__(self) 
        self.connexion=conn 
        self.ferme=0 #connexion ouverte si 0 , ou renvoie en break si 1 (ferme la connexion)
        #self.confirm=0#lorsque confirm atteint 3, tous les joueurs on repondu le '0'=> ok 
        
 
#actions du serveur en reponse au client  
    def run(self):
        grillechar=''#grille sous forme de caractere, pour la send par socket
        nom=self.getName()
        if len(conn_client)<maxj:
            conn_client[nom]=self.connexion
            conn_client[nom].send("que voulez-vous faire ?")
        while 1:
           # conn_client[nom].send("que voulez-vous faire ?")
           # print("que voulez vous faire?")#au fait ce sera pa printe, mais une application sera lance chez le client au moment de la connexion (en gros kan le client rcv) 
            msg = self.connexion.recv(1024) #recoit du client 
            print "**%s** > %s" % (nom,msg) 
            msg=msg.split(',')
            if msg[0]=='FIN' :#bouton close
                self.findeconnexion(nom)
                break
            elif msg[0]=='0': #'clientOK':
                conf.append(nom+'ok')
                self.clientOK(nom)
                if self.ferme==1:
                    break
# confirmation des clients:
                
            elif msg[0]=="OK":                
                self.OK(msg,nom)
                         
                           
# cas du clic gauche d'un client
            elif msg[0]=="L":
                self.clientclikG(msg)
               
# on renvoit la grille modifiee au client. La modification a aussi ete enregistree ds notre dictionnaire
# ds le message envoye, faut-il rajouter l et L ????????????

# cas du clic droit d'un client
            elif msg[0]=='R':
                self.clientclikD(msg)
              
#idem !!!


        self.connexion.close() 
        del conn_client[nom]
        print "client %s deconnecte "% nom + 'il reste %d joueurs'% len(conn_client)



    def findeconnexion(self,nom):
	for cli in conn_client:
            if cli!=nom:	
                conn_client[cli].send("M, " + "%s"%(nom)+" a quitte la partie")
         
        
       # del conn_client[nom]#ooo pk dans la boucle for
      



    def clientOK(self,nom):
        if len(conn_client)>maxj : #deuxieme verif
            #break ooo
            #del conn_client[nom]
            self.ferme=1
        elif len(conn_client)<maxj:
            for cli in conn_client:
                conn_client[cli].send("M, " + "il y a "+ "%d"%len(conn_client)+" joueurs, patientez") 
            for cli in conn_client:
                if cli != nom: # ne pas le renvoyer a l'emetteur
                    conn_client[cli].send("M, "+"%s"%(nom)+'a rejoint la parti')
        #  self.connexion.send("il y a"+"%d"%len(conn_client)+"joueurs, patientez") 
        elif len(conn_client)==maxj:
            print("%d"%len(conf))
#lorsque le nb de joueurs est ok pr commencer une partie , creation de la grille, envoie des parametres+grille
            for cli in conn_client:
                if cli != nom: # ne pas le renvoyer a l'emetteur
                    conn_client[cli].send("M, " +"%s"%(nom)+'a rejoint la partie')
                if len(conf)==maxj:
                    conn_client[cli].send("M, "+"Begin party ?")

    def OK(self,msg,nom):
        if len(conn_client)==maxj:
            dico[nom]=msg
            print ("%d"%len(dico))
            if len(dico)==len(conn_client):
                l=20
                L=20
                nm=50
                Demi=pyDemin(l,L,nm)#creation de l'objet demineur, et donc de la grille
                Demi.comptemine()
                grillechar=''
                for i in range(len(Demi.y)):
                    grillechar=grillechar+",%d"%Demi.y[i]	
                    print grillechar
                for cli in conn_client:
                    conn_client[cli].send('G,'+'%d , %d '%(l,L)+grillechar)
        #                    self.connexion.send('l,L,'+grillechar)
                    print("grille envoyee")
# il faut sauvegarder une grille pour chaque joueur pour suivre leurs avancees
#on cree un dico de grille
                for cli in conn_client:
                    lesgrilles[cli]=pyDemin(l,L,nm)
                    lesgrilles[cli].inf=Demi.inf[:]
                    lesgrilles[cli].deco=Demi.deco[:]
# pour chaque client, on fait attention a copier un objet et pas un pointeur
 

    def clientclikG(self,msg):
        pos=[msg[1],msg[2]]
        if lesgrilles[nom].gw==0:
            k=0
            if lesgrilles[nom].deco[int(x/30),int(y/30)]!=2:
                a=lesgrilles[nom].devoil(int(x/30),int(y/30))
                lesgrilles[nom].recusrsion(int(x/30),int(y/30))
                if a!=-1:
                    grillechar=''
                    for i in range(len(lesgrilles[nom].y)):
                        grillechar=grillechar+",%d"%lesgrilles[nom].y[i]
                    conn_client[nom].send('G,',grillechar)

                    self.init_buffer()
                else:
                    self.gw=1
                    conn_client[nom].send("PERDU")
                for i in range(lesgrilles[nom].l):
                    for j in range(lesgrilles[nom].L):
                        if lesgrilles[nom].deco[i,j]==1:
                            k+=1
                if k==(lesgrilles[nom].l*lesgrilles[nom].L-lesgrilles[nom].nm):
                    lesgrilles[nom].gw=1
                    conn_client[nom].send("GAGNE")


    def clientclikD(self,msg):
        pos=[msg[1],msg[2]]
        if lesgrilles[nom].gw==0:
            if lesgrilles.deco[int(x/30),int(y/30)]==0:
                lesgrilles.deco[int(x/30),int(y/30)]=2
			
            elif lesgrilles.deco[int(x/30),int(y/30)]==2:
                lesgrilles.deco[int(x/30),int(y/30)]=0
            grillechar=''
            for i in range(len(lesgrilles[nom].y)):
                grillechar=grillechar+",%d"%lesgrilles[nom].y[i]
                conn_client[nom].seng('G,'+grillechar)
   




# Initialisation du serveur - Mise en place du socket :



mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    mySocket.bind((host,port))
except socket.error:
    print "La liaison du socket a l'adresse choisie a echoue."
    sys.exit()
print "Serveur pret, en attente de requetes ..."
mySocket.listen(5)

while 1:
    connexion, adresse = mySocket.accept()
# Creer un nouvel objet thread pour gerer la connexion :
    th = threadconnexion(connexion)
    th.start()

#app = GameApp() 
#app.MainLoop()
